package cn.me.alphamq.broker.constant;

import cn.me.alphamq.common.constant.GlobalConstant;
import cn.me.alphamq.common.util.AssertUtil;

import java.util.HashMap;
import java.util.Map;

/**
 * broker 的常量
 *
 * @author f
 */
public class BrokerConstant {

    /**
     * 存放 broker 配置文件的路径（只有后半段，需要和 ALPHA_MQ_HOME 一起使用）
     *
     * @see cn.me.alphamq.common.constant.GlobalConstant
     */
    public static final String BROKER_CONFIG_PATH = "config/broker.properties";

    /**
     * 配置 topic 的 json 文件的路径（只有后半段，需要和 ALPHA_MQ_HOME 一起使用）
     *
     * @see cn.me.alphamq.common.constant.GlobalConstant
     */
    public static final String TOPIC_CONFIG_PATH = "config/AlphaMQ-topic.json";

    /**
     * 存储 ConsumeQueue 的消费进度的 json 文件的路径（只有后半段，需要和 ALPHA_MQ_HOME 一起使用）
     *
     * @see cn.me.alphamq.common.constant.GlobalConstant
     */
    public static final String QUEUE_OFFSET_PATH = "config/consumequeue-offset.json";

    /**
     * CommitLog 文件的最大体积，同时也是使用 MMap 映射到内存的大小，默认为 1 MB
     */
    public static final int COMMIT_LOG_MAX_SIZE = 1 * 1024 * 1024;

    /**
     * ConsumeQueue 文件的最大体积，同时也是使用 MMap 映射到内存的大小，默认为 1 MB
     */
    public static final int CONSUME_QUEUE_MAX_SIZE = 1 * 1024 * 1024;

    /**
     * 刷新 topic 配置信息的时间间隔，默认为 3s
     */
    public static final int REFRESH_TOPIC_TIME_STEP = 3;

    /**
     * 刷新 ConsumeQueue 消费进度信息的时间间隔，默认为 1s
     */
    public static final int REFRESH_OFFSET_TIME_STEP = 1;

    /**
     * 延迟队列的 topic 名称
     */
    public static final String DELAY_TOPIC_NAME = "delay";

    /**
     * 恢复延迟消息数据的消费者组名
     */
    public static final String RECOVER_DELAY_MSG_CONSUMER_GROUP = "recover_delay_msg_group";

    /**
     * 延迟消息批量拉取的数目，默认为 5
     */
    public static final int DELAY_MSG_PULL_NUM = 5;

    /**
     * 重试队列的 topic 名称
     */
    public static final String RETRY_TOPIC_NAME = "retry";

    /**
     * 死信队列的 topic 名称
     */
    public static final String DEAD_TOPIC_NAME = "dead";

    /**
     * 事务消息的延迟时间，默认是 3s
     */
    public static final int TX_MSG_DELAY_TIME = 3;

    /**
     * 重试次数 与 间隔时间 的对应表，key：重试次数，value：间隔时间（单位：s）
     */
    public static final Map<Integer, Integer> INTERVAL_TABLE = new HashMap<>();

    static {
        INTERVAL_TABLE.put(1, 15);
        INTERVAL_TABLE.put(2, 45);
        INTERVAL_TABLE.put(3, 60);
        INTERVAL_TABLE.put(4, 60 * 2);
        INTERVAL_TABLE.put(5, 60 * 3);
        INTERVAL_TABLE.put(6, 60 * 4);
        INTERVAL_TABLE.put(7, 60 * 5);
        INTERVAL_TABLE.put(8, 60 * 6);
        INTERVAL_TABLE.put(9, 60 * 7);

        // 断言表中的所有间隔时间都没有超过最大延迟时间
        INTERVAL_TABLE.values().forEach(delayTime -> AssertUtil.isInClosedRange(delayTime, 1,
                GlobalConstant.MAX_DELAY_TIME, GlobalConstant.INCORRECT_DELAY_TIME_MSG));
    }

}
